﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/*
* 1.打开文件FileFourOperationResultReadPlus.txt，判断可用性；
* 2.循环读取内容，再放入堆空间中，关闭文件；
* 3.再次打开文件，读取堆空间内容，写入到文件中，关闭文件；
*/

//main149：文本文件读写四则运算表达式和运算结果
int main149()
{
	//1.打开文件FileFourOperationResultReadPlus.txt；注意：r,w,都是小写，大写编译通不过去；
		//读写都是操作同一个文件；r+，读和写；
	FILE* fpR = fopen("../../../file/FileFourOperationResultReadPlus.txt", "r+");

	//2.判断可用性；
	if (!fpR)
	{
		return -1;
	}
	int a, b;
	char c;
	float value = 0;
	//char buf[20];
	//8.这次是一次性将文件所有的内容全部读取出来，然后放到堆空间中，所以堆空间要很大。
		//**buf存放整体内容地址，*buf存放具体内容；其实就相当于二维数组。
	char** buf = (char**)malloc(sizeof(char*) * 100);// 等同于 char* buf[100]，存放{"2+3=5\n","4*5=20\n",...}
	//buf[i] = (char*)malloc(sizeof(char) * 20); 即为buf[1] "2+3=5\n"

	//3.循环读取；FileFourOperationResultReadPlus.txt中表达式字符串是100条，故循环次数为100；
	for (int i = 0; i < 100; i++)
	{
		buf[i] = (char*)malloc(sizeof(char) * 20);
		//memset(buf, 0, 20);
		//fgets(buf, 20, fpR);//2+3=\n
		//5.格式化字符串，sscanf(),计算结果；
		//4.sscanf按照格式化拆解字符串buf，拆分出变量a,c,b；与sprinf相反，sprinf是按照格式化存入到字符串buf中；
		//sscanf(buf, "%d%c%d=\n", &a, &c, &b);
		fscanf(fpR, "%d%c%d=\n", &a, &c, &b);

		switch (c)
		{
		case '+':
			value = a + b;
			break;
		case '-':
			value = a - b;
			break;
		case '*':
			value = a * b;
			break;
		case '/':
			value = a * 1.0 / b;
			break;
		}

		//6.写入FileFourOperationResultReadPlus.txt中；使用fprintf替换下面三行代码；
		/*memset(buf, 0, 20);
		sprintf(buf, "%d%c%d=%.2f\n", a, c, b, value);
		fputs(buf, fpW);*/
		//fprintf(fpW, "%d%c%d=%.2f\n", a, c, b, value);
		//fprintf(fpR, "%d%c%d=%.2f\n", a, c, b, value);
		sprintf(buf[i], "%d%c%d=%.2f\n", a, c, b, value);
	}

	//7.文件关闭；
	fclose(fpR);

	for (int i = 0; i < 100; i++)
	{
		printf("9.将文件中的内容读取后，经过计算，存入到buf[%d]中，即：%s", i, buf[i]);
		//9.将文件中的内容读取后，经过计算，存入到buf[0]中，即：5+5=10.00	...	  5+5=10.00
	}
	//10.将结果重新写入FileFourOperationResultReadPlus.txt中；
	fpR = fopen("../../../file/FileFourOperationResultReadPlus.txt", "r+");
	if (!fpR)
	{
		return -1;
	}
	for (int i = 0; i < 100; i++)
	{
		fputs(buf[i], fpR);
	}
	fclose(fpR);

	//11.内存释放；
	for (int i = 0; i < 100; i++)
	{
		free(buf[i]);
		buf[i] = NULL;
	}
	free(buf);

	system("pause");
	return EXIT_SUCCESS;
}